// Either 函子 
// 异常会让函数变得不纯，Either函子可以来做 异常处理  类似于 if..else
class Left {
    constructor(value) {
        this._value = value 
    }
    static of(value) {
        return new Left(value)
    }
    map(fn) {
        return this
    }
}
class Right {
    constructor(value) {
        this._value = value 
    }
    static of(value) {
        return new Right(value)
    }
    map(fn) {
        return Right.of(fn(this._value))
    }
}
// 调用 看看两个区别
let r1 = Right.of(6).map(x => x + 2)
let r2 = Left.of(6).map(x => x + 2)  
console.log(r1,r2) 
// Right { _value: 8 } Left { _value: 6 } 看出来left返回原来得函子，而Right返回新得

// 测试
function parseJSON(str) {
    try {
        return Right.of(JSON.parse(str))

    }catch (err) {
        return Left.of({error: err.message})
    }
}

let f = parseJSON('{name: xm}') //我们估计写了一个错的，但是报错 执行了 Left 处理了异常
console.log(f)

let f1 = parseJSON('{"name": "xm"}').map(x => x.name.toUpperCase())
console.log(f1)


